package main

import "fmt"

func arraySet(a [2]int) {
	a[0] = 10086
}

// 切片和数组差异是中括号没有长度
func sliceSet(a []int) {
	a[0] = 10086
}

func main7() {
	var arra [2]int = [2]int{1, 2}
	for i := 0; i < len(arra); i++ {
		fmt.Println(i, arra[i])
	}
	// 定长数组的传递是值传递  整个数组进行了拷贝  因此没办法修改数组的数据
	arraySet(arra)
	fmt.Println("修改后：")
	for i, j := range arra {
		fmt.Println(i, j)
	}
	// 	var arrb [10]int
	// 	arrb = [10]int{1, 2, 3, 4}
	// 数组长度不同  类型被认为是不一样的  不能这么传
	//  arraySet(arrb)
	fmt.Println()
	//以下是切片声明并赋值 方式一
	var slicea []int = []int{1, 2, 3, 4, 5}
	for i, j := range slicea {
		fmt.Println(i, j)
	}
	sliceSet(slicea)
	fmt.Println("修改后：")
	for i, j := range slicea {
		fmt.Println(i, j)
	}

	// 切片声明方式二
	var sliceb []int = make([]int, 5)

	// 切片声明方式三 最常用  自动推断
	slicec := make([]int, 5)

	fmt.Println(sliceb, slicec)

	var sliced []int
	// 默认声明好的长度是0
	fmt.Println(sliced, len(sliced), cap(sliced), sliced == nil)
	// 声明完不赋值直接使用索引会报错
	// sliced[0] = 1

	// len = 3  cap = 5
	sliced = make([]int, 3, 5)
	// 追加数据
	sliced = append(sliced, 1)
	fmt.Println(sliced, len(sliced), cap(sliced))
	sliced = append(sliced, 1)
	fmt.Println(sliced, len(sliced), cap(sliced))
	// 每次扩容都是上次的cap的两倍
	sliced = append(sliced, 1)
	fmt.Println(sliced, len(sliced), cap(sliced))

	// 不带cap参数时 cap = len
	sliced = make([]int, 3)
	fmt.Println(sliced, len(sliced), cap(sliced))

	// 截取
	sliced = []int{3, 2, 1}
	slicee := sliced[0:2] // 下标左闭右开
	fmt.Println(sliced, slicee)
	// 截取实际上是浅拷贝
	slicee[0] = 5
	fmt.Println(sliced, slicee)

	// 深拷贝方式 copy
	slicef := make([]int, 3)

	copy(slicef, sliced)
	slicee[0] = -5
	fmt.Println(sliced, slicef)

}
